﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace AppServidor
{
    public partial class Form1 : Form
    {
        Bitacora_Server ui_bitacora;
        Server server;
        public Form1()
        {
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            
            server = new Server();
            server.iniciar();
            
            gra = new GraficaMelodia();
            this.leyenda_canales.Image = gra.Leyenda;
            musico = IntrumentoMusical.newInstance();
            this.pictureBox1.Image = gra.Grafica;
            musico.add(gra);
            reproductor = new Thread(new ThreadStart(actualizar_grafica));

            reproductor.Start();
            cargar_listas_reproduccion();
        }

        private void cargar_listas_reproduccion() {

            BibliotecaLista.cargar_data_lista();
            List<Lista> listas = BibliotecaLista.bibliotecaListas;
            this.listBox2.Items.Clear();
            foreach (Lista aux in listas)
                this.listBox2.Items.Add(aux);
        }

        Thread reproductor;
        IntrumentoMusical musico;
        int tiempo=5;//min
        int time_refresh = 100;//1/2 seg
        GraficaMelodia gra;

        Lista actual;

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void actualizar_grafica() {

            while(true){
                gra.finalizar();
                this.pictureBox1.Image = gra.Grafica;
                Thread.Sleep(time_refresh);
            }
        }
        private void splitContainer1_Panel2_Paint(object sender, PaintEventArgs e)
        {

        }

        private void button7_Click(object sender, EventArgs e)
        {
            if (!rbtn_pista.Checked)
            {
                //compilar
                AnalizadorLista interprete = new AnalizadorLista();
               bool error= interprete.isValid(txtSource.Text, new sintacticoListas());
               if (error) { MessageBox.Show("Error sintactico en el archivo de lista"); }
               else
               {
                   BibliotecaLista.cargar_data_lista();
                   List<Lista> listas = BibliotecaLista.bibliotecaListas;
                   this.listBox2.Items.Clear();
                   foreach (Lista aux in listas)
                       this.listBox2.Items.Add(aux);
                   this.tabControl1.SelectTab(0);
               }
            }
            else {

                CompiladorPista compi = new CompiladorPista();
                Pista p=compi.getPista(txtSource.Text);
                if (p != null)
                {
                    MessageBox.Show("Se compilo correctamente la Pista: " + p.Nombre);

                    ///añadir al reposito
                    p.calcularTiempo();
                    p.guardar(p.Nombre);
                }
                else {
                    MessageBox.Show("Error a leer la pista");
                }
            }
        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }

        private void tabPage2_Click(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {

        }

       
        private void numerar()
        {
            StringBuilder str = new StringBuilder();
            int linemax=0;
           // int linemax = this.textBox1.Lines.Length; 
            for (int i = 1; i <= linemax; i++)
            {
                str.Append(i + "");
                str.Append("\r\n");
            }

            //textBox2.Text = str.ToString();
        }

        private void tabPage2_Click_1(object sender, EventArgs e)
        {

        }

        private void listBox2_MouseDown(object sender, MouseEventArgs e)
        {
          Lista aux= (Lista) this.listBox2.SelectedItem;
          actual = aux;
          if (aux != null) {
              listBox3.Items.Clear();
              foreach (String pista in aux.Pistas) {
                  listBox3.Items.Add(pista);
              }
          
          }
        }

        private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
        private void setDuracion(int milisegundos) { 
          double segundos=(double)(milisegundos/1000);
          int segundos_ent=(int)segundos;
          double decimas = (segundos - segundos_ent) * 1000;
         
        //  segundos=( segundos * 60);
          this.l_S_seg.Text = String.Format(CultureInfo.InvariantCulture,
                   "{0:00}", segundos) + " seg con " + String.Format(CultureInfo.InvariantCulture,
                   "{0:00.00}", decimas) + " ms";
        }
        Thread hilo_lista_play;
        private void button3_Click(object sender, EventArgs e)
        {
            Lista aux = actual;

            if (aux != null)
            {
                listBox1.Items.Clear();
                foreach (String pista in aux.Pistas)
                {
                    Pista auxp = Pista.abrir(pista);
                    listBox1.Items.Add(auxp);
                }
                 hilo_lista_play = new Thread(new ThreadStart(reproducir_lista));
                 hilo_lista_play.Name = "Hilo reproduccion de lista";
                hilo_lista_play.Start();
                actual.refresh();
            

            }
           
               
        }


        public void reproducir_lista() {
            if (actual != null)
            {
                int indice = 0;
                Pista aux = actual.siguientePista(indice);
                if (!actual.Random)
                {
                    while (indice < actual.Pistas.Count)
                    {
                        if (aux != null)
                        {
                            this.listBox1.SelectedIndex = indice;
                            this.listBox1.Select();
                            
                            reproducir_pista(aux);
                            Thread.Sleep(aux.Duracionms);
                           
                        }
                        indice++;
                        if (actual.Circular && indice >= actual.Pistas.Count)
                        {
                            indice = 0;
                        }
                        aux = actual.siguientePista(indice);
                    }

                }
                else {
                    Random r = new Random(0);

                    while (indice < actual.Pistas.Count) {
                        int i = r.Next(0, actual.Pistas.Count);
                        aux = actual.siguientePista(i);
                        if (aux != null)
                        {
                            reproducir_pista(aux);
                            Thread.Sleep(aux.Duracionms);
                        }
                        indice++;
                        if (actual.Circular && indice >= actual.Pistas.Count)
                        {
                            indice = 0;
                        }
                    }
                }
                
            }
        }

        private void reproducir_pista(Pista p) {
        //    Pista p = Pista.abrir("La_alegria");
         
            /*
          
            int i = 6;
            for (int j = 0; j < 4; j++)
            {
               
                   p.add("Si", i, 100, 3);//1
                   p.add("Si", i, 100, 3);//1
                   p.add("Do", i, 100, 3);//1
                   p.add("Re", i, 100, 3);//1
                   p.add("Re", i, 100, 3);//1
                   p.add("pausa", i, 10, 3);//1
                   p.add("Do", i, 100, 3);//1
                   p.add("Si", i, 100, 3);//1
                   p.add("La", i, 100, 3);//1
                   p.add("Sol", i, 100, 3);//1
                   p.add("pausa", i, 10, 3);//1
                   p.add("La", i, 100, 3);//1
                   p.add("Si", i, 100, 3);//1
                   p.add("Sol", i, 100, 3);//1
                   p.add("La", i, 100, 3);//1
                   p.add("Si", i, 100, 3);//1
                   p.add("Do", i, 100, 3);//1
                   p.add("Si", i, 100, 3);//1
                   p.add("Sol", i, 100, 3);//1
                   p.add("Sol", i, 100, 3);//1
                   p.add("La", i, 100, 3);//1
                   p.add("Re", i, 100, 3);//1
            }
             * */
           // p.guardar("La_alegria");
            p.calcularTiempo();
            gra.bar = this.progressBar1;
            gra.X_max = p.Duracionms;
            setDuracion(gra.X_max);
            gra.Y_max = 4500;//Hz

            gra.iniciar();
            musico.reproducir(p);
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            
            Environment.Exit(0);
        }
        bool pause = false;

        private void button8_Click(object sender, EventArgs e)
        {if(!pause){
            this.button8.Image = global::AppServidor.Properties.Resources.pausa1;
          
        }
        else{
            this.button8.Image = global::AppServidor.Properties.Resources.play1;
        }
        pause = !pause;
        }

        private void abrirCodigoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string path;
            OpenFileDialog file = new OpenFileDialog();
            file.Filter = "Text Files (.txt)|*.txt|Lista (*.lista, *.list)|*.lista;*.list";
            if (file.ShowDialog() == DialogResult.OK)
            {
                path = file.FileName;
                using (StreamReader sr = new StreamReader(path))
                {
                    String line = sr.ReadToEnd();
                    this.rbtn_lista.Checked = true;
                    this.txtSource.Text = line;
                    tabControl1.SelectTab(1);
                }
            }
        }

        private void abrirPistaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string path;
            OpenFileDialog file = new OpenFileDialog();
            file.Filter = "Archivo de Texto (.txt)|*.txt|Archivo de Pista(*.pista, *.p)|*.pista;*.p";
            if (file.ShowDialog() == DialogResult.OK)
            {
                path = file.FileName;
                using (StreamReader sr = new StreamReader(path))
                {
                    String line = sr.ReadToEnd();
                    this.rbtn_pista.Checked = true;
                    this.txtSource.Text = line;
                }
            }
        }

        private void listBox3_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void listBox3_MouseDown(object sender, MouseEventArgs e)
        {
           String nombre = (String)this.listBox3.SelectedItem;
        
            Lista auxL = new Lista();
            actual = auxL;
            auxL.Nombre = nombre;
            auxL.add(nombre);
            if (auxL != null)
            {
                listBox1.Items.Clear();
                foreach (String pista in auxL.Pistas)
                {
                    Pista auxp = Pista.abrir(pista);
                    listBox1.Items.Add(auxp);
                }

            }
        }

        private void button9_Click(object sender, EventArgs e)
        {

        }

        private void button5_Click(object sender, EventArgs e)
        { Lista aux= (Lista) this.listBox2.SelectedItem;
         
          if (aux != null) {
              if (!aux.Equals("Toda la musica"))
              {
                
              this.txtSource.Text = aux.generarCodigo();
              this.tabControl1.SelectTab(1);
              this.rbtn_lista.Checked = true;
              
              }
          }
           
        }

        private void button6_Click(object sender, EventArgs e)
        {
            Lista aux= (Lista) this.listBox2.SelectedItem;
            actual = null;
          if (aux != null) {
              if (!aux.Equals("Toda la musica"))
              {
                  BibliotecaLista.eliminar_lista(aux.Nombre);
                  cargar_listas_reproduccion();
              }
          }
           
        }

        private void button2_Click(object sender, EventArgs e)
        {
         Pista aux = (Pista)this.listBox1.SelectedItem;
           if (aux != null) {
               this.txtSource.Text = aux.generarCodigo();
               this.tabControl1.SelectTab(1);
               this.rbtn_pista.Checked = true;
               
           }
        }

        private void button10_Click(object sender, EventArgs e)
        {
          PeticionAndroid p=  ProcesadorXml.procesar_respuesta(txtSource.Text);
          if (p != null) {
              String a = p.Tipo;
              a += "\n" + p.Nombre + "\n";
              if (p.Pista != null) {
                  a += p.Pista.generarCodigo();
              }
              MessageBox.Show(a);
          }
        }

        private void verBitacoraServerToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ui_bitacora = new Bitacora_Server();
            ui_bitacora.server = server;
            ui_bitacora.iniciar();
            this.ui_bitacora.Show();
        }
    }
}
